﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#include "GcmpPickInterface.h"
#include "ContainerUtil.h"

#pragma once
namespace gcmp
{
    class IDocument;
    /// \brief 表格选择服务类接口
    class GCMP_PICK_INTERFACE_EXPORT IDrawingTableSelectionService
    {
    public:
        /// \brief 离散选择服务接口
        ///
        /// 例如：在进行Ctrl+选择时，该接口可以根据平台定义的规则更新选择集中的表格对象
        /// 规则：若Ctrl+选择集中的内容跨表格或者跨分页了，则更新选择集内容为全是表格对象
        /// \param pDocument 当前所在文档
        /// \return void
        static void DiscreteUpdateSelection(IDocument* pDocument);

        /// \brief 连续选择服务接口
        ///
        /// 例如：在进行Shift选择时，该接口可以根据平台定义的规则更新选择集中的表格对象
        ///       该行为处理需与已有的Selection结果与currentPickResults中引用节点对比重新更新Selection集合
        /// 规则：0.默认行为：如果当前Selection没有表格、单元格或者currentPickResults没有表格或者单元格则按照之前默认的shift行为，调用ISelection::DeleteGroupGraphicsNodeReference从选择集中删除图形节点引用；
        ///       1.如果当前Selection有表格但是没有单元格，currentPickResults中有表格或单元格，且表格在当前Selection中，则从选择集里面减该表格（该表格的单元格也不进入选择集），否则保持0默认行为；
        ///       2.如果当前Selection有单元格，currentPickResults中也有单元格，若两者中存在单元格共页，则扩充单元格选择集为范围内所有单元格；若跨分页或者跨表格，则选中表格；
        ///       3.其他情况与默认行为0处理一致。
        /// \param pDocument 当前所在文档
        /// \param currentPickResults 当前拾取结果集
        /// \return void
        static void ContinuousUpdateSelection(IDocument* pDocument,const GraphicsNodeReferenceOwnerPtrSet& currentPickResults);


        /// \brief 刷新选择集服务
        ///
        /// 使用场景：拖动分页夹点后，原先被选中的单元格会被分到多页。因此分页夹点拖动完成后需要更新选择集。
        /// 注意事项：使用该接口时需要注意，选择集刷新后，夹点会重新生成，那么刷新之前拿到的夹点对象会被清除。
        /// \param pDocument 当前所在文档
        /// \param tableElementId 需要更新选择集的表格对象
        /// \return void
        static void RefreshSelection(IDocument* pDocument, ElementId tableElementId);
    };
}